package HuaWeiOd.online;

import java.util.*;

/**
 * 干货湿货
 */
class B_Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int num = in.nextInt();
        Integer[] goods = new Integer[num];
        for (int i = 0; i < num; i++) {
            goods[i] = in.nextInt();
        }
        // 湿货
        ArrayList<Integer> wGoods = new ArrayList<Integer>();
        // 干货
        ArrayList<Integer> dGoods = new ArrayList<Integer>();
        for (int i = 0; i < num; i++) {
            if (in.nextInt() == 0) {
                dGoods.add(goods[i]);
            } else {
                wGoods.add(goods[i]);
            }
        }
        // 单类车数量
        int k = in.nextInt();
        List<ArrayList<Integer>> datas = new ArrayList<ArrayList<Integer>>();
        datas.add(wGoods);
        datas.add(dGoods);
        

        System.out.println(Math.max(function(k, wGoods), function(k, dGoods)));

    }

    private static int function(int k, ArrayList<Integer> data) {
        // 货物排序
        data.sort(Comparator.naturalOrder());
        // 单类货物中的最大值
        int maxGoodsVal = data.get(data.size() - 1);
        // 单类货物的总值
        int sumGoodsVal = data.stream().reduce(Integer::sum).orElse(0);
        while (maxGoodsVal < sumGoodsVal) {
            // 循环从最大值和总数之间取平均值 最大值递增 假设车的容量为x
            int x = (maxGoodsVal + sumGoodsVal) / 2;
            // 每个车的容量
            int[] cap = new int[k];
            Arrays.fill(cap, x);


            if (dfs(0, data.size(), k, cap, data, x)) {
                sumGoodsVal = x;
            } else {
                maxGoodsVal = x + 1;
            }
        }
        return maxGoodsVal;
    }

    /**
     *
     * @param i 递归下标
     * @param n n种货
     * @param k k辆车
     * @param cap 假设每个车的容量数组
     * @param data  货物数组
     * @param x 假设车的容量
     * @return
     */
    public static boolean dfs(int i, int n, int k, int[] cap, List<Integer> data, int x) {
        if (i == n) {
            return true;
        }
        for (int j = 0; j < k; j++) {
            if (cap[j] >= data.get(i)) {
                cap[j] -= data.get(i);
                if (dfs(i + 1, n, k, cap, data, x)) {
                    return true;
                }
                cap[j] += data.get(i);
            }
            if (cap[j] == x) {
                break;
            }
        }
        return false;
    }
}
// 18 47 59 81 81 87
// 29 22 7